package pers.qianyu.module.image.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.stereotype.*;
import pers.qianyu.module.core.comm.*;
import pers.qianyu.module.core.domain.image.converter.*;
import pers.qianyu.module.core.domain.image.dto.*;
import pers.qianyu.module.core.domain.image.entity.*;
import pers.qianyu.module.core.domain.image.query.*;
import pers.qianyu.module.core.domain.image.vo.*;
import pers.qianyu.module.image.dao.*;
import pers.qianyu.module.image.exception.*;
import pers.qianyu.module.image.service.*;

import java.util.*;

/**
 * @author mizzle rain
 * @date 2021-02-11 13:19
 */
@Service("noticeService")
public class NoticeServiceImpl implements NoticeService {
    @Autowired
    private NoticeDao noticeDao;
    @Autowired
    private NoticeConverter noticeConverter;

    @Override
    public Long insert(NoticeDTO noticeDTO) {
        NoticePO noticePO = noticeConverter.convertToPO(noticeDTO);
        noticeDao.insert(noticePO);
        return noticePO.getId();
    }

    @Override
    public void delete(NoticeDTO noticeDTO) {
        NoticePO noticePO = noticeConverter.convertToPO(noticeDTO);
        QueryWrapper<NoticePO> wrapper = new QueryWrapper<>(noticePO);
        noticeDao.delete(wrapper);
    }

    @Override
    public Pagination<NoticeVO> query(NoticeQuery noticeQuery) {
        Page<NoticePO> pageQuery = new Page<>(noticeQuery.getPage(), noticeQuery.getLimit());
        NoticePO noticePO = noticeConverter.convertToPO(noticeQuery);
        QueryWrapper<NoticePO> wrapper = new QueryWrapper<>(noticePO);
        wrapper.orderByDesc("create_time");
        Page<NoticePO> noticePOPage = noticeDao.selectPage(pageQuery, wrapper);
        return noticeConverter.convertToPagination(noticePOPage);
    }

    @Override
    public void deleteById(Long id) {
        NoticePO noticePO = noticeDao.selectById(id);
        if (Objects.isNull(noticePO)) {
            throw new ImageException(ImageErrorCodeEnum.INVALID_NOTICE_ID);
        }
        noticeDao.deleteById(id);
    }

    @Override
    public void updateStatus(NoticeForUpdateStatusDTO notice) {
        if (!Objects.equals(notice.getStatus(), 1) &&
                !Objects.equals(notice.getStatus(), 0)) {
            throw new ImageException(ImageErrorCodeEnum.INVALID_NOTICE_STATUS);
        }
        NoticePO noticePO = new NoticePO();
        noticePO.setId(notice.getId());
        noticePO.setStatus(notice.getStatus());
        noticeDao.updateById(noticePO);
    }
}
